package ybl.qianchuan;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;

import ybl.qianchuan.entities.QianchuanAweme;

/**
 * 管理QianChuan API的账户，处理获取店铺列表、账户列表和抖音账户信息等操作。
 */
public class AccountManage {
    private static final QianChuanConfig QIANCHUAN_CONFIG = ConfigSingleton.getInstance();
    private static final String APP_ID = QIANCHUAN_CONFIG.getQIANCHUAN().getAPP_ID();
    private static final String APP_SECRET = QIANCHUAN_CONFIG.getQIANCHUAN().getAPP_SECRET();
    private static final String OPEN_API_URL_PREFIX = QIANCHUAN_CONFIG.getQIANCHUAN().getOPEN_API_URL_PREFIX();

    /**
     * 获取授权账户（店铺ID）列表。
     *
     * @param accessToken API授权的访问令牌。
     * @return 包含店铺列表的JSONObject。
     */
    private static JSONObject getShopList(String accessToken) {
        Map<String, Object> params = new HashMap<>() {
            {
                put("app_id", APP_ID);
                put("secret", APP_SECRET);
                put("access_token", accessToken);
            }
        };
        return HttpRequest.get(OPEN_API_URL_PREFIX + "oauth2/advertiser/get/", params);
    }

    /**
     * 获取店铺关联的QianChuan账户（广告账户）列表。
     *
     * @param accessToken API授权的访问令牌。
     * @param shopId      店铺的ID。
     * @param page        页码。
     * @param pageSize    每页的数量。
     * @return 包含广告账户列表的JSONObject。
     */
    private static JSONObject getAccountListByShopId(String accessToken, int shopId, int page, int pageSize) {
        Map<String, Object> params = new HashMap<>() {
            {
                put("shop_id", shopId);
                put("page", page);
                put("page_size", pageSize);
            }
        };
        return HttpRequest.get(OPEN_API_URL_PREFIX + "v1.0/qianchuan/shop/advertiser/list/", params, accessToken);
    }

    /**
     * 获取店铺关联的QianChuan账户（广告账户）列表（默认每页20条）。
     *
     * @param accessToken API授权的访问令牌。
     * @param shopId      店铺的ID。
     * @return 包含广告账户列表的JSONObject。
     */
    private static JSONObject getAccountListByShopId(String accessToken, int shopId, int page) {
        return getAccountListByShopId(accessToken, shopId, page, 20);
    }

    private static JSONObject getAccountListByShopId(String accessToken, int shopId) {
        return getAccountListByShopId(accessToken, shopId, 1, 20);
    }

    /**
     * 获取QianChuan账户下的授权抖音账户列表。
     *
     * @param accessToken  API授权的访问令牌。
     * @param advertiserId QianChuan账户的ID。
     * @param page         页码。
     * @param pageSize     每页的数量。
     * @return 包含授权抖音账户列表的JSONObject。
     */
    private static JSONObject getAwemeListByQianchuanId(String accessToken, Long advertiserId, int page, int pageSize) {
        Map<String, Object> params = new HashMap<>() {
            {
                put("advertiser_id", advertiserId);
                put("page", page);
                put("page_size", pageSize);
            }
        };
        return HttpRequest.get(OPEN_API_URL_PREFIX + "v1.0/qianchuan/aweme/authorized/get/", params, accessToken);
    }

    /**
     * 获取QianChuan账户下的授权抖音账户列表（默认每页20条）。
     *
     * @param accessToken  API授权的访问令牌。
     * @param advertiserId QianChuan账户的ID。
     * @return 包含授权抖音账户列表的JSONObject。
     */
    private static JSONObject getAwemeListByQianchuanId(String accessToken, Long advertiserId, int page) {
        return getAwemeListByQianchuanId(accessToken, advertiserId, page, 20);
    }

    private static JSONObject getAwemeListByQianchuanId(String accessToken, Long advertiserId) {
        return getAwemeListByQianchuanId(accessToken, advertiserId, 1, 20);
    }

    private static void initAweme(String accessToken, JSONObject awemeListResponse, Long advertiserId,
            String accessTokenName) {
        JSONArray awemes = awemeListResponse.getJSONObject("data").getJSONArray("aweme_id_list");
        // 处理授权抖音账户信息...
        for (JSONObject aweme : awemes.toJavaList(JSONObject.class)) {

            StoreManage.saveQianchuanAweme(Map.of(
                    "accessTokenName", accessTokenName,
                    "awemeAvatar", aweme.getString("aweme_avatar"),
                    "awemeHasLivePermission", aweme.getBoolean("aweme_has_live_permission"),
                    "awemeHasUniProm", aweme.getBoolean("aweme_has_uni_prom"),
                    "awemeHasVideoPermission", aweme.getBoolean("aweme_has_video_permission"),
                    "awemeId", aweme.getLong("aweme_id"),
                    "awemeName", aweme.getString("aweme_name"),
                    "awemeShowId", aweme.getString("aweme_show_id"),
                    "awemeStatus", aweme.getString("aweme_status"),
                    "qianchuanId", advertiserId));
        }
    }

    private static void handleQianchuan(String accessToken, JSONObject qianchuanListResponse, String accessTokenName) {
        JSONArray qianchuans = qianchuanListResponse.getJSONObject("data").getJSONArray("adv_id_list");
        for (JSONObject account : qianchuans.toJavaList(JSONObject.class)) {
            long advertiserId = account.getLongValue("adv_id");

            // 3. 获取每个账户的授权抖音账户列表, 要考虑分页
            JSONObject awemeListResponse = getAwemeListByQianchuanId(accessToken, advertiserId);
            initAweme(accessToken, awemeListResponse, advertiserId, accessTokenName);
            int totalPage = awemeListResponse.getJSONObject("data").getJSONObject("page_info")
                    .getIntValue("total_page");
            for (int i = 2; i <= totalPage; i++) {
                awemeListResponse = getAwemeListByQianchuanId(accessToken, advertiserId, i);
                initAweme(accessToken, awemeListResponse, advertiserId, accessTokenName);
            }
        }
    }

    public static void getQianchuanAwemeAllByAccessTokenName(String accessTokenName) {
        // 清空旧数据
        StoreManage.deleteQianchuanAwemeByaccessTokenName(accessTokenName);
        String accessToken = Auth.getAccessTokenByAccessTokenName(accessTokenName).getAccessToken();
        // 1. 获取所有店铺
        JSONObject shopListResponse = getShopList(accessToken);
        JSONArray shops = shopListResponse.getJSONObject("data").getJSONArray("list");

        for (JSONObject shop : shops.toJavaList(JSONObject.class)) {
            int shopId = shop.getInteger("advertiser_id");
            // 2. 获取每个店铺的账户列表, 要考虑分页
            JSONObject accountListResponse = getAccountListByShopId(accessToken, shopId);
            handleQianchuan(accessToken, accountListResponse, accessTokenName);
            int totalPage = accountListResponse.getJSONObject("data").getJSONObject("page_info")
                    .getIntValue("total_page");
            for (int i = 2; i <= totalPage; i++) {
                accountListResponse = getAccountListByShopId(accessToken, shopId, i);
                handleQianchuan(accessToken, accountListResponse, accessTokenName);
            }
        }
    }

    /**
     * 根据awemeShowId获取千川模板
     * 
     * @param awemeShowId awemeShowId
     * @return List<QianchuanAweme> 千川模板列表
     */
    public static List<QianchuanAweme> getQianchuanAwemesByawemeShowId(String awemeShowId) {
        return StoreManage.getQianchuanAwemesByawemeShowId(awemeShowId);
    }

    /**
     * 根据awemeShowId和awemeHasUniProm获取aweme列表
     * 
     * @param awemeShowId aweme show id
     * @return 预先购买的aweme列表
     */
    public static List<QianchuanAweme> getQianchuanAwemesAwemeHasUniProm(String awemeShowId) {
        return StoreManage.getQianchuanAwemesByawemeShowIdAndAwemeHasUniProm(awemeShowId);
    }

    /**
     * 根据awemeShowId获取单个前川aweme
     * 
     * @param awemeShowId aweme的展示id
     * @return 返回对应的前川aweme
     */
    public static QianchuanAweme getOneQianchuan(String awemeShowId) {
        return StoreManage.getOneQianchuanAwemesByawemeShowId(awemeShowId);
    }

    public static void deleteQianchuanAweme(Long qianchuanId) {
        StoreManage.deleteQianchuanAwemeByqianchuanId(qianchuanId);
    }

    // public static void main(String[] args) {
    // // 设置utf-8编码
    // System.setProperty("file.encoding", "UTF-8");

    // getQianchuanAwemeAllByAccessTokenName("15618242794");
    // // System.out.println(getOneQianchuan("Kans_SkinCare"));;
    // }
}